#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include "./sistema.h"

int ARQUIVOS_compara(char * arq1, char * arq2)
{
	struct tm *arq;
	struct stat attrib;
	int arqv1[6], arqv2[6];
	
	// Armazena em attrib os status do arq1 
	stat(arq1, &attrib);
	// Copia em arq os atributos da componente st_mtime (time of last modification) 
   	arq = gmtime(&(attrib.st_mtime));
	// Armazena a data do último save do arq1 no vetor arqv1 na ordem year_mon_day_hour_min_sec
	arqv1[0] = arq->tm_year; arqv1[1] = arq->tm_mon; arqv1[2] = arq->tm_mday;
	arqv1[3] = arq->tm_hour; arqv1[4] = arq->tm_min; arqv1[5] = arq->tm_sec; 	
	stat(arq2, &attrib);
   	arq = gmtime(&(attrib.st_mtime));
	arqv2[0] = arq->tm_year; arqv2[1] = arq->tm_mon; arqv2[2] = arq->tm_mday;
	arqv2[3] = arq->tm_hour; arqv2[4] = arq->tm_min; arqv2[5] = arq->tm_sec; 
	// Compara a idade dos arquivos baseado na ordem de relevância das unidades (year->...->seconds)
	if(arqv1[0] < arqv2[0])
		return TRUE;
	else if(arqv1[1] < arqv2[1])
		return TRUE;
	else if(arqv1[2] < arqv2[2])
		return TRUE;
	else if(arqv1[3] < arqv2[3])
		return TRUE;
	else if(arqv1[4] < arqv2[4])
		return TRUE;
	else if(arqv1[5] < arqv2[5])
		return TRUE;
	else return FALSE;
}

int ARQUIVOS_verifica(char * pathArq)
{
	int retorno;
	// Tenta abrir o arquivo 'pathArq' com a função open só no modo leitura. Se não conseguir abrir o arquivo a função retorna -1
	retorno = open(pathArq, O_RDONLY);
	if(retorno == -1)
		return FALSE;
	else return TRUE;
}

int ARQUIVOS_copia(char * pathOrg, char * pathDest)
{
	pid_t pid;
	int status;
	pid = fork();
	// Processo filho executa o comando 'cp'
	if(pid == 0){
		// Executa o comando "cp -r parthOrg pathDest"
		if(execlp("cp", "cp ", "-r", pathOrg, pathDest, NULL) == -1)
			exit(1);
		else exit(0);
	// Processo pai fica a esperar o filho terminar o comando 'cp'
	} else if( pid > 0){
		// Espera pero filho armazenando suas caracteristicas em 'status'
		wait(&status);
		// Verifica se o status de saída do filho para verificar se correu bem
		if(WEXITSTATUS(status) == 1)
			return FALSE;
		else return TRUE;
	} else return FALSE;
}

int ARQUIVOS_lista(char * path, int * numArqs, char * listaArqs[])
{
	DIR *diretorio;
	struct dirent *dirt;

	// Abre o diretório passado como parâmetro 'path'	
	if((diretorio = opendir(path)) == NULL) return FALSE;

	*numArqs = 0;
	// Enquanto não chegar ao fim do diretório, continua a ler a próxima entrada
	while((dirt = readdir(diretorio)) != NULL){
		// Se a estrutura encontrada for um arquivo regular, esse nome é salvo em listaArqs
		if(dirt->d_type == DT_REG){
			listaArqs[*numArqs] = malloc(sizeof(dirt->d_name));
			strcpy(listaArqs[*numArqs], dirt->d_name);
			(*numArqs)++;		
		}
	}
	// Fecha o diretório passado como parâmetro 'path'
	if(closedir(diretorio) == -1) return FALSE;
	return TRUE;
}
